/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle;

import java.io.IOException;
import java.io.RandomAccessFile;
import modelo.SuperBloco;

/**
 *
 * @author root
 */
public class ControleSuperBloco extends SuperBloco{
    private RandomAccessFile arquivo;
    
    public ControleSuperBloco ( RandomAccessFile arquivo ) throws IOException {
        this.arquivo = arquivo;
        
        arquivo.seek(1);
        bytesPorBloco = arquivo.readInt();
        totalBlocos = arquivo.readInt();
        tamanhoDisco = arquivo.readLong();
        entradasNinis = arquivo.readInt();
        deslocamentoNinis = arquivo.readLong();
        deslocamentoBitmap = arquivo.readLong();
        blocosReservados = arquivo.readInt();
        deslocamentoAreaDados = arquivo.readLong();
        blocosparaUso = arquivo.readInt();
        arquivo.read(nomeSistemaArquivos);
        arquivo.read(nomeParticao);
        
    }
    
    public void atualizar ( int bytesporBloco ) throws IOException {
        
        int bitsPorBloco = bytesporBloco << 3;
        
        tamanhoDisco = arquivo.length();
        bytesPorBloco = bytesporBloco;
        totalBlocos = (int)(tamanhoDisco / bytesporBloco);
        
        long arquivos = ( ( tamanhoDisco - bytesporBloco ) / ( bitsPorBloco + 514 ) ) << 3;
        int blocosBitMapNinis = Math.round( (float) arquivos / ( bytesporBloco << 6 ) );
        int blocosNinis = (blocosBitMapNinis << 9);
        
        entradasNinis = blocosBitMapNinis * bitsPorBloco;
        deslocamentoNinis = entradasNinis + bytesporBloco;
        deslocamentoBitmap = (blocosBitMapNinis + blocosNinis + 1) * bytesporBloco;
        blocosparaUso = (int)(((tamanhoDisco - deslocamentoBitmap) << 3 ) / ( bitsPorBloco + 1 ));
        blocosReservados = 2 + (blocosparaUso/bitsPorBloco) + blocosBitMapNinis + blocosNinis;
        deslocamentoAreaDados = bytesporBloco * blocosReservados;
        nomeSistemaArquivos = "Ninef".getBytes();
        
        arquivo.seek(1);
        arquivo.writeInt(bytesPorBloco);
        arquivo.writeInt(totalBlocos);
        arquivo.writeLong(tamanhoDisco);
        arquivo.writeInt(entradasNinis);
        arquivo.writeLong(deslocamentoNinis);
        arquivo.writeLong(deslocamentoBitmap);
        arquivo.writeInt(blocosReservados);
        arquivo.writeLong(deslocamentoAreaDados);
        arquivo.writeInt(blocosparaUso);
        arquivo.write(nomeSistemaArquivos);
        arquivo.write(nomeParticao);
    }

    @Override
    public String toString() {
        return "ControleSuperBloco {\n" 
                + "\tbytesPorSetor :\t\t " + bytesPorBloco + "\t\tbytes\n"
                + "\ttotalBlocos :\t\t " + totalBlocos + "\n"
                + "\ttamanhoDisco :\t\t " + tamanhoDisco + "\tbytes\n"
                + "\tentradasNinis :\t\t " + entradasNinis + "\n"
                + "\tdeslocamentoNinis :\t " + deslocamentoNinis + "\t\tbytes\n"
                + "\tdeslocamentoBitmap :\t " + deslocamentoBitmap + "\tbytes\n"
                + "\tblocosReservados :\t " + blocosReservados + "\n"
                + "\tbytesReservados :\t " + deslocamentoAreaDados + "\tbytes\n"
                + "\tblocosParaUso :\t\t " + blocosparaUso + "\t\n"
                + "}";
    }
    
    
}
